
#include "../includes.h"
#include "AH_BlkDirFileLib.h" 
/*
**************************************************************************************************************
*										  常 量
**************************************************************************************************************
*/
#define  AH_DEF_BLKDIR_FILE_NO					( DEF_NC_BlkFileMaxNum )		//黑名单目录文件总个数

#define  AH_DEF_BlkDir_Size						( 40ul )						//黑名单目录文件大小
#define  AH_DEF_BlkDir_MaxBufSize				( AH_DEF_BlkDir_Size + 4 )		//4字节目录文件编号

/*
**************************************************************************************************************
*										  类 型
**************************************************************************************************************
*/

/*
**************************************************************************************************************
*										  变 量
**************************************************************************************************************
*/
typedef struct
{
	U08 BlkFileNo[4];	//黑名单目录文件编号1--0xFFFFFFFE
}_Stc_BlkFileDirFile;	//记录目录文件

_Stc_BlkFileDirFile  BlkFileDirFile[AH_DEF_BLKDIR_FILE_NO];			//黑名单文件结构体定义

/*
**************************************************************************************************************
*         								  函 数
**************************************************************************************************************
*/
/*
**************************************************************************************************************
*         								  函 数
**************************************************************************************************************
*/
void NC_FileLock( void )
{
	
}

/*
**************************************************************************************************************
*文件解锁
**************************************************************************************************************
*/

void NC_FileUnLock( void )
{
	
}

U16 const CRC__Tab[] =  {
//CRCTB1: ;?256??
	0x00000,0x01021,0x02042,0x03063,
	0x04084,0x050a5,0x060c6,0x070e7,
	0x08108,0x09129,0x0a14a,0x0b16b,
	0x0c18c,0x0d1ad,0x0e1ce,0x0f1ef,
	0x01231,0x00210,0x03273,0x02252,
	0x052b5,0x04294,0x072f7,0x062d6,
	0x09339,0x08318,0x0b37b,0x0a35a,
	0x0d3bd,0x0c39c,0x0f3ff,0x0e3de,
	0x02462,0x03443,0x00420,0x01401,
	0x064e6,0x074c7,0x044a4,0x05485,
	0x0a56a,0x0b54b,0x08528,0x09509,
	0x0e5ee,0x0f5cf,0x0c5ac,0x0d58d,
	0x03653,0x02672,0x01611,0x00630,
	0x076d7,0x066f6,0x05695,0x046b4,
	0x0b75b,0x0a77a,0x09719,0x08738,
	0x0f7df,0x0e7fe,0x0d79d,0x0c7bc,
	0x048c4,0x058e5,0x06886,0x078a7,
	0x00840,0x01861,0x02802,0x03823,
	0x0c9cc,0x0d9ed,0x0e98e,0x0f9af,
	0x08948,0x09969,0x0a90a,0x0b92b,
	0x05af5,0x04ad4,0x07ab7,0x06a96,
	0x01a71,0x00a50,0x03a33,0x02a12,
	0x0dbfd,0x0cbdc,0x0fbbf,0x0eb9e,
	0x09b79,0x08b58,0x0bb3b,0x0ab1a,
	0x06ca6,0x07c87,0x04ce4,0x05cc5,
	0x02c22,0x03c03,0x00c60,0x01c41,
	0x0edae,0x0fd8f,0x0cdec,0x0ddcd,
	0x0ad2a,0x0bd0b,0x08d68,0x09d49,
	0x07e97,0x06eb6,0x05ed5,0x04ef4,
	0x03e13,0x02e32,0x01e51,0x00e70,
	0x0ff9f,0x0efbe,0x0dfdd,0x0cffc,
	0x0bf1b,0x0af3a,0x09f59,0x08f78,
//CRCTB2: ;?256??
	0x09188,0x081a9,0x0b1ca,0x0a1eb,
	0x0d10c,0x0c12d,0x0f14e,0x0e16f,
	0x01080,0x000a1,0x030c2,0x020e3,
	0x05004,0x04025,0x07046,0x06067,
	0x083b9,0x09398,0x0a3fb,0x0b3da,
	0x0c33d,0x0d31c,0x0e37f,0x0f35e,
	0x002b1,0x01290,0x022f3,0x032d2,
	0x04235,0x05214,0x06277,0x07256,
	0x0b5ea,0x0a5cb,0x095a8,0x08589,
	0x0f56e,0x0e54f,0x0d52c,0x0c50d,
	0x034e2,0x024c3,0x014a0,0x00481,
	0x07466,0x06447,0x05424,0x04405,
	0x0a7db,0x0b7fa,0x08799,0x097b8,
	0x0e75f,0x0f77e,0x0c71d,0x0d73c,
	0x026d3,0x036f2,0x00691,0x016b0,
	0x06657,0x07676,0x04615,0x05634,
	0x0d94c,0x0c96d,0x0f90e,0x0e92f,
	0x099c8,0x089e9,0x0b98a,0x0a9ab,
	0x05844,0x04865,0x07806,0x06827,
	0x018c0,0x008e1,0x03882,0x028a3,
	0x0cb7d,0x0db5c,0x0eb3f,0x0fb1e,
	0x08bf9,0x09bd8,0x0abbb,0x0bb9a,
	0x04a75,0x05a54,0x06a37,0x07a16,
	0x00af1,0x01ad0,0x02ab3,0x03a92,
	0x0fd2e,0x0ed0f,0x0dd6c,0x0cd4d,
	0x0bdaa,0x0ad8b,0x09de8,0x08dc9,
	0x07c26,0x06c07,0x05c64,0x04c45,
	0x03ca2,0x02c83,0x01ce0,0x00cc1,
	0x0ef1f,0x0ff3e,0x0cf5d,0x0df7c,
	0x0af9b,0x0bfba,0x08fd9,0x09ff8,
	0x06e17,0x07e36,0x04e55,0x05e74,
	0x02e93,0x03eb2,0x00ed1,0x01ef0
                               };

/*
**************************************************************************************************************
*
* 函数原型：U16 AH_DataCrc( U08 *buf, U32 size, U32 mode )
*
* 函数功能：存储器数据进行CRC校验
*
* 函数输入：buf  需要进行CRC校验的数据
*			size 需要校验的数据长度  (有效数据长度，不包括CRC校验值)
*			mode 校验模式  
*						0:  该串数据是否通过校验   返回校验的CRC值 
*						1:  为该串数据增加CRC校验  同时返回校验的CRC值	自动追加到数据串的尾
*						2:  自动校验CRC是否正确，返回: 0成功，非0失败
*
* 函数输出：无
*
* 函数返回：0   成功
*			非0 失败	模式为2时，返回100 表示CRC校验失败
*   
**************************************************************************************************************
*/
U16 AH_MemorDataCrc( U08 *buf, U32 size, U32 mode )
{
	U32 i;
	INT_16BIT_08BIT	 crc;
	INT_16BIT_08BIT	 y;

	crc.Int16Bit = 0;

	for( i = 0 ; i < size ; i++ )
	{
		y.Int16Bit    = CRC__Tab[ buf[ i ] ^ crc.Int08Bit.H ];
		y.Int08Bit.H ^= crc.Int08Bit.L;
		crc.Int16Bit  = y.Int16Bit;
	}
	if( mode == 1 )
	{
		buf[ i++ ] = y.Int08Bit.H;
		buf[ i ]   = y.Int08Bit.L;
	}
	else if( mode == 2 )
	{
		if( ( buf[i] == y.Int08Bit.H ) && (  buf[i+1] == y.Int08Bit.L ) )
		{ return 0; }								//CRC校验通过

		return 100;
	}
	return( crc.Int16Bit );
}

/*
**************************************************************************************************************
*
* 函数原型：void AH_MemorDataCpy( U08 *outbuf, U08 *inbuf, U32 insize )
*
* 函数功能：数据复制				 
*
* 函数输入：inbuf		数据存储缓冲区
*			insize		需要复制的数据长度
*                
* 函数输出：outbuf		复制目标存储缓冲区
*
* 函数返回：无 
*   
**************************************************************************************************************
*/
void AH_MemorDataCpy( U08 *outbuf, U08 *inbuf, U32 insize )
{
	U32 i;
	for( i = 0; i < insize; i++ )
	{ outbuf[i] = inbuf[i]; }
}

/*
**************************************************************************************************************
*
* 函数原型：void AH_MemorDataSet( U08 *outbuf, U08 indata, U32 insize )
*
* 函数功能：数据设置 
*
* 函数输入：indata		需要设置的数值
*			insize		需要设置的数据长度
*                
* 函数输出：outbuf		复制目标存储缓冲区
*
* 函数返回：无 
*   
**************************************************************************************************************
*/
void AH_MemorDataSet( U08 *outbuf, U08 indata, U32 insize )
{
	U32 i;
	for( i = 0; i < insize; i++ )
	{ outbuf[i] = indata; }
}

/*
**************************************************************************************************************
*
* 函数原型：U32 AH_MemorDataCmp( U08 *inbuf1, U08 *inbuf2, U32 insize )
*
* 函数功能：数据比较							(内部调用)
*
* 函数输入：inbuf1		需要比较的数据存储缓冲区1
*			inbuf2		需要比较的数据存储缓冲区2
*			insize		需要比较的数据长度
*                
* 函数输出：无
*
* 函数返回：0		数据相同
*			非0		数据不相同
*   
**************************************************************************************************************
*/
U32 AH_MemorDataCmp( U08 *inbuf1, U08 *inbuf2, U32 insize )
{
	U32 i;
	for( i = 0; i < insize; i++ )
	{ 
		if( inbuf1[i] != inbuf2[i] )
		{ return 1; }
	}
	return 0;	
}

/*
**************************************************************************************************************
*
* 函数原型：U32 AH_MemorDataLen( U08 *inbuf )
*
* 函数功能：计算字符串长度		 
*
* 函数输入：inbuf		需要计算数据存储缓冲区
*                
* 函数输出：无
*
* 函数返回：数据长度
*   
**************************************************************************************************************
*/
U32 AH_MemorDataLen( U08 *inbuf )
{
	U32 i=0;

	while( 1 )
	{ 
		if( inbuf[i++] == 0 )
		{ break; }
	}
	return ( i - 1 );
}

/*
**************************************************************************************************************
*
* 函数原型：U32 AH_MemorAD( U08 *inbuf )
*
* 函数功能：数据正反正反校验		 
*
* 函数输入：inbuf		需要校验的4字节缓冲区
*                
* 函数输出：无
*
* 函数返回：0		校验通过
*			非0		校验失败
*   
**************************************************************************************************************
*/
U32 AH_MemorAD( U08 *inbuf )
{
	U08 buf[4];

	buf[0] = (~inbuf[1]);
	buf[1] = (~inbuf[3]);
	if( inbuf[0] != buf[0] )
	{ return 1; }
	if( inbuf[2] != buf[1] )
	{ return 1; }
	return 0;
}
/*
**************************************************************************************************************
*
* 函数原型：U32 AH_MemorLRC( U08 *inbuf, U32 len )
*
* 函数功能：数据进行异或校验
*
* 函数输入：inbuf		需要校验的缓冲区
*           len			需要校验的数据长度
*                
* 函数输出：无
*
* 函数返回：校验结果
*   
**************************************************************************************************************
*/
U08 AH_MemorLRC( U08 *inbuf, U32 len )
{
	U08 Lrc = 0 ;
	while( len-- )
	{ 
		Lrc ^= *inbuf++; 
	}
	return Lrc;
}
/*
**************************************************************************************************************
*
* 函数原型：U32 ah_BlkDirFileCheck( U32 id )
*
* 函数功能：记录文件合法性检测
*
* 函数输入：id		创建文件ID号, 目前最大支持创建5个文件
*		    size 	文件大小
*       
* 函数输出：无
*
* 函数返回：0   成功
*			非0 失败
*   
**************************************************************************************************************
*/
U32 ah_BlkDirFileCheck( U32 id )
{
	if( ( id == 0 ) || ( id > AH_DEF_BLKDIR_FILE_NO ) )		//ID号有校性判断
	{ return 200; }

	return 0;
}
U32 AH_FLASH_ReadData1( char *filename, U32 add, U08 *buf, U32 size, U32 back_add, U32 stat )
{
	//char fname[20];
	FILE * fid;
	U32 ret = 0;

	//memset(fname,0,20);
	//sprintf(fname,"rec%02x.bin",id);
	fid = fopen(filename,"rb");
	if( fid < 0 )
	{
		DEF_Err_Debug;
		goto Error;
	}
	ret = fseek(fid, add, SEEK_SET);
	if( ret != 0 )
		goto Error;
	ret = fread( buf,1,size,fid);
	if( ret < 0 )
		goto Error;
	else if( ret < size )
		return 1;
	ret = fclose(fid);
	if( ret != 0 )
		goto Error;

	return 0;
	Error:
	DEF_Err_Debug;
	return 1;
}
U32 AH_FLASH_WriteData1( char *filename,U32 add, U08 *buf, U32 size, U32 back_add, U32 stat, U32 mode )
{
	//char fname[20];
	FILE * fid;
	U32 ret = 0;

	//memset(fname,0,20);
	//sprintf(fname,"rec%02x.bin",id);
    //size = RecCfg[dirid].recsize;               //记录长度
    if( stat & AH_DEF_MEMOR_CRC )					//需要将数据添加上CRC校验
	{
		AH_MemorDataCrc( buf, size-2, 1 );			//将要写入的数据添加上CRC校验
	}
	//===================>>写记录
	fid = fopen(filename,"ab");
	if( fid < 0 )
	{
		DEF_Err_Debug;
		goto Error;
	}
	ret = fseek(fid, add, SEEK_SET);
	if( ret != 0 )
		goto Error;
	ret = fwrite(buf,size,1,fid);
	if( ret < 0 )
		goto Error;

	ret = fclose(fid);
	if( ret != 0 )
		goto Error;

	return 0;
	Error:
	DEF_Err_Debug;
	return 1;
}
U32 AH_FRAM_WriteData1( char *filename, U32 add, U08 *buf, U32 size, U32 back_add, U32 stat )
{
	U32 ret;
	//char dname[20];
	FILE * fid;

	//memset(dname,0,20);
	//sprintf(dname,"rec%02x.dir",id);

	if( stat & AH_DEF_MEMOR_CRC )					//需要将数据添加上CRC校验
	{
		AH_MemorDataCrc( buf, size-2, 1 );			//将要写入的数据添加上CRC校验
	}
	fid = fopen(filename,"wb");
	if( fid < 0 )
	{
		DEF_Err_Debug;
		goto Error;
	}
	ret = fseek(fid, add, SEEK_SET);								//fseekµÄadd·¶Î§±ØÐëÐ¡ÓÚµÈÓÚÎÄ¼þ´óÐ¡£¬·ñÔò»áÒç³ö
	if( ret != 0 )
		goto Error;

	ret = fwrite(buf,size,1,fid);
	if( ret < 0 )
		goto Error;

	ret = fclose(fid);
	if( ret != 0 )
		goto Error;

	return 0;
	Error:
	DEF_Err_Debug;
	return 1;
}
																	
U32 AH_FRAM_ReadData1( char *filename, U32 add, U08 *buf, U32 size, U32 back_add, U32 stat )
{
	U32 ret;
	//char dname[20];
	FILE * fid;

	//memset(dname,0,20);
	//sprintf(dname,"rec%02x.dir",id);

	fid = fopen(filename,"rb");
	if( fid < 0 )
	{
		DEF_Err_Debug;
		goto Error;
	}
	ret = fseek(fid, add, SEEK_SET);	
	if( ret != 0 )
		goto Error;
	ret = fread(buf, 1,size,fid);
	if( ret < 0 )
		goto Error;
	else if( ret < size )	//
		return 1;
	ret = fclose(fid);
	if( ret != 0 )
		goto Error;

	return 0;
	Error:
	DEF_Err_Debug;
	return 1;
}
/*
**************************************************************************************************************
*
* 函数原型：U32 ah_BlkFileId2Name( U32 isdir, U32 id, char *filename )
*
* 函数功能：黑名单文件ID转换为文件名
*
* 函数输入：isdir       是否是目录文件
*           id			创建文件ID号, 目前最大支持创建10个文件
*		    filename 	文件名字，缓冲长度最少提供100字节
*       
* 函数输出：无
*
* 函数返回：0   成功
*			非0 失败
*   
**************************************************************************************************************
*/
U32 ah_BlkFileId2Name( U32 isdir, U32 id, char *filename )
{
 	memset( filename, '\0', 100 );
 	//sprintf( filename, APP_FILE_PRENAME );
	if( isdir )
 		strcat( filename, "BDF" );
	else
 		strcat( filename, "BF" );

	switch( id )
	{
		case DEF_BlkMemoryBank_Black:
			strcat( filename, "BLSTBLK" );
			break;
		case DEF_RecMemoryBank_White:
			strcat( filename, "BLSTWHT" );
			break;
		default:
			return 1;
	}
	
	return 0;
}

/*
**************************************************************************************************************
*
* 函数原型：U32 AH_Create_BlkDirFile( U32 id )
*
* 函数功能：创建黑名单目录文件
*
* 函数输入：id   创建文件ID号, 目前最大支持创建5个文件     
*       
* 函数输出：无
*
* 函数返回：0          成功  
*           其它       失败  
*   
**************************************************************************************************************
*/
U32 AH_Create_BlkDirFile( U32 id )
{
	U32 	dirid,rcode,add;
	U08 	AH_BlkFileBufTx[AH_DEF_BlkDir_MaxBufSize];			//目录临时缓存
	char 	FileName[100] = {0};

	if( ( id == 0 ) || ( id > AH_DEF_BLKDIR_FILE_NO ) )			//ID号有效性判断
	{ return 200; }

	dirid = ( id - 1 );	

	BlkFileDirFile[dirid].BlkFileNo[0]  = 0; 
    BlkFileDirFile[dirid].BlkFileNo[1]  = 0; 
	BlkFileDirFile[dirid].BlkFileNo[2]  = 0; 
	BlkFileDirFile[dirid].BlkFileNo[3]  = 1; 

	AH_MemorDataCpy( AH_BlkFileBufTx, BlkFileDirFile[dirid].BlkFileNo, 4 );
	AH_MemorDataSet( AH_BlkFileBufTx+4, 0, AH_DEF_BlkDir_Size );//保存数据	

	ah_BlkFileId2Name( 1, id, FileName );
	add = 0;
	rcode = AH_FRAM_WriteData1( FileName,
			                   add, 
							   AH_BlkFileBufTx, 
							   AH_DEF_BlkDir_MaxBufSize, 
							   ( add + AH_DEF_BlkDir_MaxBufSize ), 
							   ( AH_DEF_MEMOR_BACK | AH_DEF_MEMOR_CRC ) );
	return rcode;
}

/*
**************************************************************************************************************
*
* 函数原型：U32 AH_Open_BlkDirFile( U32 id )
*
* 函数功能：打开黑名单目录文件
*
* 函数输入：无
*       
* 函数输出：无
*
* 函数返回：0          成功  
*           其它       失败  
*   
**************************************************************************************************************
*/
U32 AH_Open_BlkDirFile( U32 id )
{
	U32 	dirid,rcode,add;
	U08 	AH_BlkFileBufTx[AH_DEF_BlkDir_MaxBufSize];		//目录临时缓存
	char 	FileName[100] = {0};

	if( ( id == 0 ) || ( id > AH_DEF_BLKDIR_FILE_NO ) )		//ID号有校性判断
	{ return 200; }

	dirid = ( id - 1 );	

	ah_BlkFileId2Name( 1, id, FileName );
	add = 0;
	rcode = AH_FRAM_ReadData1(  FileName,
							   add, 
							   AH_BlkFileBufTx, 
							   AH_DEF_BlkDir_MaxBufSize, 
							   ( add + AH_DEF_BlkDir_MaxBufSize ), 
							   ( AH_DEF_MEMOR_BACK | AH_DEF_MEMOR_CRC ) );
    if( rcode != 0 )
	{ return rcode;	}

	AH_MemorDataCpy( BlkFileDirFile[dirid].BlkFileNo, AH_BlkFileBufTx, 4 );
															//保存文件
															//保存文件
	return 0;
}

/*
**************************************************************************************************************
*
* 函数原型：U32 AH_Read_BlkDirFile( U32 id, U08 *buf )
*
* 函数功能：读取黑名单目录文件
*
* 函数输入：id      需要读取的文件ID号
*
* 函数输出：buf     读取的文件存储缓冲区 
*
* 函数返回：0          成功  
*           其它       失败 
*   
**************************************************************************************************************
*/
U32 AH_Read_BlkDirFile( U32 id, U08 *buf )
{
	U32 	rcode,dirid,add;
	U08 	AH_BlkFileBufTx[AH_DEF_BlkDir_MaxBufSize];		//目录临时缓存
	char 	FileName[100] = {0};

	rcode = ah_BlkDirFileCheck( id );						//用户文件目录文件校验
	if( rcode != 0 )
	{ return rcode; }

	dirid = ( id - 1 );	

	ah_BlkFileId2Name( 1, id, FileName );
	add = 0;
	rcode = AH_FRAM_ReadData1(  FileName,
							   add, 
							   AH_BlkFileBufTx, 
							   AH_DEF_BlkDir_MaxBufSize, 
							   ( add + AH_DEF_BlkDir_MaxBufSize ), 
							   ( AH_DEF_MEMOR_BACK | AH_DEF_MEMOR_CRC ) );

	AH_MemorDataCpy( BlkFileDirFile[dirid].BlkFileNo, AH_BlkFileBufTx, 4 );

	AH_MemorDataCpy( buf, AH_BlkFileBufTx+4, AH_DEF_BlkDir_Size ); 	
															//保存文件
	return 0;
}

/*
**************************************************************************************************************
*
* 函数原型：U32 AH_Write_BlkDirFile( U32 id, U08 *buf )
*
* 函数功能：写黑名单目录文件
*
* 函数输入：id      需要写入的文件ID号
*           buf     写入的文件存储缓冲区
*
* 函数输出：
*
* 函数返回：0          成功  
*           其它       失败 
*   
**************************************************************************************************************
*/
U32 AH_Write_BlkDirFile( U32 id, U08 *buf )
{
	U32 	rcode,dirid,add;
	U08 	AH_BlkFileBufTx[AH_DEF_BlkDir_MaxBufSize];		//目录临时缓存
	INT_32BIT_08BIT Int32; 
	char 	FileName[100] = {0};

	rcode = ah_BlkDirFileCheck( id );						//目录文件校验
	if( rcode != 0 )
	{ return rcode; }

	dirid = ( id - 1 );

	Int32.Int08Bit.HH = BlkFileDirFile[dirid].BlkFileNo[0]; 
	Int32.Int08Bit.HL = BlkFileDirFile[dirid].BlkFileNo[1]; 
	Int32.Int08Bit.LH = BlkFileDirFile[dirid].BlkFileNo[2]; 
	Int32.Int08Bit.LL = BlkFileDirFile[dirid].BlkFileNo[3];	
	Int32.Int32Bit++;				  						//编号自动加1
	BlkFileDirFile[dirid].BlkFileNo[0] =  Int32.Int08Bit.HH; 
	BlkFileDirFile[dirid].BlkFileNo[1] =  Int32.Int08Bit.HL; 
	BlkFileDirFile[dirid].BlkFileNo[2] =  Int32.Int08Bit.LH; 
	BlkFileDirFile[dirid].BlkFileNo[3] =  Int32.Int08Bit.LL;	 

	AH_MemorDataCpy( AH_BlkFileBufTx, BlkFileDirFile[dirid].BlkFileNo, 4 );

	AH_MemorDataCpy( AH_BlkFileBufTx+4, buf, AH_DEF_BlkDir_Size );	
															//保存数据	
	ah_BlkFileId2Name( 1, id, FileName );
	add = 0;
	rcode = AH_FRAM_WriteData1( FileName,
							   add, 
							   AH_BlkFileBufTx, 
							   AH_DEF_BlkDir_MaxBufSize, 
							   ( add + AH_DEF_BlkDir_MaxBufSize ), 
							   ( AH_DEF_MEMOR_BACK | AH_DEF_MEMOR_CRC ) );
	return rcode;
}

